﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using FirmaKurierska.Models;
using FirmaKurierska.Filters;
using System.Web.Security;
using FirmaKurierska.Areas.Admin.Models;
using WebMatrix.WebData;

namespace FirmaKurierska.Areas.Admin.Controllers
{
    [Authorize(Roles="Administrator")]
    [InitializeSimpleMembership]
    public class UzytkownicyController : Controller
    {           
        /// <summary>
        /// Wyświetla listę klientów
        /// </summary>
        /// <returns>Lista klientów </returns>
        public ActionResult Index()
        {
            var dbContext = new UsersContext();
            var users = dbContext.UserProfiles.ToList();

            var dbCentrale = new PlacowkaEntities();
            var centrales = dbCentrale.Centrale.ToList();

            List<UzytkownikViewModel> listauzytkownikow = new List<UzytkownikViewModel>();            

            foreach (var user in users)
            {
                var Profil = new UzytkownikViewModel();
                
                Profil.Login = user.UserName;
                Profil.Imie = user.Email;
                Profil.UserId = user.UserId;
                
                var rol = Roles.GetRolesForUser(user.UserName).ToList();
                try
                {
                    Profil.Rola = rol[0];
                }
                catch (Exception)
                {
                    Profil.Rola = "Klient";
                }
                Profil.CentralaId = user.CentralaId;
                Profil.CentralaName = centrales[user.CentralaId].Nazwa;
                listauzytkownikow.Add(Profil);
            }           
            
            return View(listauzytkownikow);
        }

        /// <summary>
        /// Pozwala na zmianę roli użytkownika 
        /// </summary>
        /// <param name="id">Id użytkownika</param>
        /// <param name="form">Formularz z wybraną rolą</param>
        /// <returns>Powrót do głównej strony użytkowników</returns>
        [HttpPost, ActionName("Edit")]
        [ValidateAntiForgeryToken]
        public ActionResult Edit(int id, FormCollection form)
        {
            string[] role = { "Kierowca", "Administrator", "Klient", "Pracownik" };          

            var dbContext = new UsersContext();
            var klucz = form["Rola"].ToString();
            if(klucz.Equals("") ) return RedirectToAction("Index");
            string rola = role[Convert.ToInt16(klucz)];
             var tmp = new UzytkownikViewModel();
            var user = dbContext.UserProfiles.Find(id);

            var tmpRoles = Roles.GetRolesForUser(user.UserName);
            try
            {
                Roles.RemoveUserFromRoles(user.UserName, tmpRoles);
            }
            catch (Exception){}
           
            Roles.AddUserToRole(user.UserName, rola);            
            return RedirectToAction("Index");
        }       

        /// <summary>
        /// Wyświetla panel przypisania roli dla użytkownika
        /// </summary>
        /// <param name="id">Id użytkownika</param>
        /// <returns>Lista ról dostępnych dla użytkownika</returns>
        [HttpGet]
        public ActionResult Edit(int id)
        {
            var dbContext = new UsersContext();
            try
            {
                var user = dbContext.UserProfiles.Find(id);
                var tmpUser = new UzytkownikViewModel();
                tmpUser.Login = user.UserName;
                tmpUser.UserId = user.UserId;

                return View(tmpUser);
            }
            catch
            {
                return RedirectToAction("Index");
            }
            
        }

        /// <summary>
        /// Wyświetla szczegóły użytkownika do usunięcia
        /// </summary>
        /// <param name="id">Id użytkownika do usunięcia</param>
        /// <returns>Widok użytkownika</returns>
        [HttpGet]
        public ActionResult Delete(int id=0)
        {
            var dbContext = new UsersContext();            
            try
            {
                var user = dbContext.UserProfiles.Find(id);
                return View(user);
            }
            catch
            {
                return RedirectToAction("Index");
            }
        }
        
        /// <summary>
        /// Usuwa wybranego użytkownika
        /// </summary>
        /// <param name="id">Id użytkownika do usunięcia</param>
        /// <returns>Powrót do głównej strony</returns>
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteConfirmed(int id)
        {
            var dbContext = new UsersContext();
            
                var user = dbContext.UserProfiles.Find(id);                
                ((SimpleMembershipProvider)Membership.Provider).DeleteAccount(user.UserName);
                string[] allRoles = Roles.GetRolesForUser(user.UserName);
                Roles.RemoveUserFromRoles(user.UserName, allRoles);
                Membership.Provider.DeleteUser(user.UserName, true);
                Membership.DeleteUser(user.UserName, true);
                return RedirectToAction("Index");          
        }
    }
}
